﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Transactions;
using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ThaiHoa.Win.QLSX.Entity;
using ThaiHoa.Win.QLSX.Kho.UTI;
using ThaiHoa.Win.QLSX.DAL;
using Excel = Microsoft.Office.Interop.Excel;

namespace ThaiHoa.Win.QLSX.Kho.UI
{
    public partial class frmXuatKho : Form
    {
        #region Fields
        KhoDBContext db;
        Access acs;
        NhapXuatKho nhapXuatKho;
        List<DonVi> listDonVi;
        List<Nguoi> listNguoiDaiDien;
        List<MatHang> listMatHang;
        #endregion
        #region Constructor
        public frmXuatKho()
        {
            InitializeComponent();
        }
        #endregion
        #region Functions
        private void KhoiTao()
        {
            db = new KhoDBContext();
            acs = new Access();
            nhapXuatKho = new NhapXuatKho();
            nhapXuatKho.NhapXuat = false;//set là xuất;
            dgvXuatKho.DataSource = nhapXuatKho.DanhSachChiTiet;
            DataGridViewImageColumn xoaColumn = new DataGridViewImageColumn();
            xoaColumn.Name = "Xoa";
            xoaColumn.HeaderText = "Xóa";
            xoaColumn.Image = global::ThaiHoa.Win.QLSX.Kho.Properties.Resources.n_Delete;
            xoaColumn.Width = 30;
            xoaColumn.DisplayIndex = 6;
            dgvXuatKho.Columns.Add(xoaColumn);
            CustomerGridview();
            //combo mặt hàng
            listMatHang = db.MatHang.Include("DonViTinh").Where(m => m.TrangThai).ToList();
            cbMaMatHang.DataSource = listMatHang;
            //cbMaMatHang.AutoCompleteSource = listMatHang;
            //combo đơn vị
            listDonVi = db.DonVi.Where(d => d.TrangThai).ToList();
            cbDonVi.DataSource = listDonVi;
            cbDonVi.DataBindings.Clear();
            //set mặc định cho  textbox
            txtDonGia.Text = "0";
            txtSoLuong.Text = "1";
        }
        private bool KiemTraHopLe()
        {
            bool result = true;
            errP.Clear();
            //kiểm tra số chứng từ
            if (txtSoChungTu.Text == "")
            {
                errP.SetError(txtSoChungTu, "Số chứng từ không được rỗng");
                result = false;
            }
            //kiểm tra trùng lặp số chứng từ
            if (db.NhapXuatKho.Any(n => n.TrangThai
                && n.SoChungTu.Equals(txtSoChungTu.Text)
                && !n.Id.Equals(nhapXuatKho.Id)))
            {
                errP.SetError(txtSoChungTu, "Số chứng từ này đã được dùng");
                result = false;
            }
            //kiểm tra đơn vị
            if (cbDonVi.SelectedItem == null)
            {
                errP.SetError(cbDonVi, "Đơn vị không hợp lệ");
                result = false;
            }
            //kiểm tra người dại diện
            if (cbNguoiDaiDien.SelectedItem == null)
            {
                errP.SetError(cbNguoiDaiDien, "Người đại diện không hợp lệ");
                result = false;
            }
            return result;
        }
        private void ReLoadData()
        {
            if (db != null) db.Dispose();
            KhoiTao();
        }
        private void LuuLai()
        {
            bool complete = true;
            if (!KiemTraHopLe()) return;
            if (Common.ShowMessengerConfirmSave("Lưu lại và thoát ?") == DialogResult.Yes)
            {
                nhapXuatKho.NguoiDaiDien = cbNguoiDaiDien.SelectedItem as Nguoi;
                nhapXuatKho.DonVi = cbDonVi.SelectedItem as DonVi;
                nhapXuatKho.SoChungTu = txtSoChungTu.Text;
                nhapXuatKho.NoiDung = txtNoiDung.Text;
                //2 trường hợp thêm mới và edit
                NhapXuatKho item = db.NhapXuatKho.Include(n => n.DonVi).Include(n => n.NguoiDaiDien).Include(n => n.DanhSachChiTiet).FirstOrDefault(n => n.TrangThai && n.Id.Equals(nhapXuatKho.Id));
                if (item != null)//Lưu lại
                {
                    item.NguoiDaiDien = nhapXuatKho.NguoiDaiDien;
                    item.DonVi = nhapXuatKho.DonVi;
                    item.SoChungTu = nhapXuatKho.SoChungTu;
                    item.NoiDung = nhapXuatKho.NoiDung;
                }
                else
                {
                    db.NhapXuatKho.Add(nhapXuatKho);
                }
                using (TransactionScope transaction = new TransactionScope())
                {
                    string mesErr = "";
                  //  try
                    {
                        //lưu bản nhập kho vào csdl
                        db.SaveChanges();
                        //cập nhật lại số lượng mặt hàng
                        foreach (NhapXuatKhoChiTiet ct in nhapXuatKho.DanhSachChiTiet)
                        {
                            switch (ct.MatHang.GetType().Name)
                            {
                                case "ThepDac":
                                    ThepDac thepDac = db.ThepDac.Include(m => m.DonViTinh).Include(t => t.MacThep).Include(t => t.LoaiVatTu).FirstOrDefault(m => m.TrangThai && m.Id.Equals(ct.MatHang.Id));
                                    if (thepDac.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", thepDac.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                    thepDac.SoLuong -= ct.SoLuong;
                                    break;
                                case "ThepOng":
                                    ThepOng thepOng = db.ThepOng.Include(m => m.DonViTinh).Include(t => t.MacThep).Include(t => t.LoaiVatTu).FirstOrDefault(m => m.TrangThai && m.Id.Equals(ct.MatHang.Id));
                                    if (thepOng.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", thepOng.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        thepOng.SoLuong -= ct.SoLuong;
                                    break;
                                case "ThepTam":
                                    ThepTam thepTam = db.ThepTam.Include(m => m.DonViTinh).Include(t => t.MacThep).Include(t => t.LoaiVatTu).FirstOrDefault(m => m.TrangThai && m.Id.Equals(ct.MatHang.Id));
                                    if (thepTam.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", thepTam.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        thepTam.SoLuong -= ct.SoLuong;
                                    break;
                                case "Luoi":
                                    Luoi luoi = db.Luoi.Include(m => m.DonViTinh).Include(t => t.LoaiLuoi).Include(t => t.LoaiVatTu).FirstOrDefault(m => m.TrangThai && m.Id.Equals(ct.MatHang.Id));
                                    if (luoi.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", luoi.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        luoi.SoLuong -= ct.SoLuong;
                                    break;
                                case "Ton":
                                    Ton ton = db.Ton.Include(m => m.DonViTinh).Include(t => t.MacTon).Include(t => t.LoaiVatTu).FirstOrDefault(m => m.TrangThai && m.Id.Equals(ct.MatHang.Id));
                                    if (ton.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", ton.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        ton.SoLuong -= ct.SoLuong;
                                    break;
                                case "ThanhPham":
                                    ThanhPham thanhPham = db.ThanhPham.Include(t => t.DonViTinh).FirstOrDefault(t => t.TrangThai && t.Id.Equals(ct.MatHang.Id));
                                    if (thanhPham.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", thanhPham.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        thanhPham.SoLuong -= ct.SoLuong;
                                    break;
                                case "BanThanhPham":
                                    BanThanhPham banThanhPham = db.BanThanhPham.Include(b => b.DonViTinh).FirstOrDefault(b => b.TrangThai && b.Id.Equals(ct.MatHang.Id));
                                    if (banThanhPham.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                       mesErr+= string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", banThanhPham.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        banThanhPham.SoLuong -= ct.SoLuong;
                                    break;
                                case "CongCuDungCu":
                                    CongCuDungCu congCuDungCu = db.CongCuDungCu.Include(c => c.DonViTinh).FirstOrDefault(c => c.TrangThai && c.Id.Equals(ct.MatHang.Id));
                                    if (congCuDungCu.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr += string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", congCuDungCu.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        congCuDungCu.SoLuong += ct.SoLuong;
                                    break;
                                case "MayMoc":
                                    MayMoc mayMoc = db.MayMoc.Include(c => c.DonViTinh).Include(c => c.LoaiMay).FirstOrDefault(c => c.Id.Equals(ct.MatHang.Id));
                                    if (mayMoc.SoLuong < ct.SoLuong)
                                    {
                                        complete=false;
                                        mesErr+= string.Format("Số lượng mặt hàng {0} trong kho không đủ {1}", mayMoc.TenMatHang,Environment.NewLine);
                                    }
                                    else
                                        mayMoc.SoLuong += ct.SoLuong;
                                    break;
                            }
                        }
                        //Lưu lại mặt hàng sau khi cập nhật số lượng
                        if (complete)
                        {
                            db.SaveChanges();
                        }
                        else
                        {
                            Common.ShowMessengerError(mesErr);
                        }
                    }
                    if (complete)
                    {
                        this.Close();
                        transaction.Complete();
                    }
                }
            }
        }
        private bool KiemTraHopLeKhiThemMoi()
        {
            bool result = true;
            errP.Clear();
            if (cbMaMatHang.SelectedItem == null)
            {
                errP.SetError(cbMaMatHang, "Mã mặt hàng không hợp lệ");
                result = false;
            }
            //Kiểm tra số lượng
            double soLuong;
            //kiểm tra hợp kiểu
            if (!double.TryParse(txtSoLuong.Text, out soLuong))
            {
                errP.SetError(txtSoLuong, "Số lượng không hợp lệ");
                result = false;
            }
            //kiểm tra > 0
            if (soLuong <= 0)
            {
                errP.SetError(txtSoLuong, "Số lượng không hợp lệ");
                result = false;
            }
            //kiểm tra quá số lượng còn trong kho
            MatHang matHang = cbMaMatHang.SelectedItem as MatHang;
            if (matHang.SoLuong < soLuong)
            {
                errP.SetError(txtSoLuong, "Số lượng hàng trong kho không đủ");
                result = false;
            }
            decimal donGia;
            if (!decimal.TryParse(txtDonGia.Text, out donGia))
            {
                errP.SetError(txtDonGia, "Đơn giá không hợp lệ");
                result = false;
            }
            if (donGia < 0)
            {
                errP.SetError(txtDonGia, "Đơn giá không hợp lệ");
                result = false;
            }
            return result;
        }
        private void ThemMatHang()
        {
            if (!KiemTraHopLeKhiThemMoi()) return;
            //Kiểm tra xem đã có  trong danh sách chưa
            MatHang matHang = cbMaMatHang.SelectedItem as MatHang;
            NhapXuatKhoChiTiet item = null;
                item = nhapXuatKho.DanhSachChiTiet.FirstOrDefault(l => l.MatHang.Id.Equals(matHang.Id));
            if (item == null)//trường hợp chưa có
            {
                item = new NhapXuatKhoChiTiet();
                item.MatHang = matHang;
                item.SoLuong = Convert.ToDouble(txtSoLuong.Text);
                item.DonGia = Convert.ToDecimal(txtDonGia.Text);
                nhapXuatKho.DanhSachChiTiet.Insert(0,item);
            }
            else//đã có
            {
                double soLuong = Convert.ToDouble(txtSoLuong.Text);
                item.SoLuong += soLuong;
                decimal donGia = Convert.ToDecimal(txtDonGia.Text);
                if (donGia != item.DonGia)
                {
                    //Thay đơn giá cũ bằng đơn giá mới
                    item.DonGia = donGia;
                }
            }
            //reload lại gridview
            dgvXuatKho.DataSource = nhapXuatKho.DanhSachChiTiet.Where(d => d.TrangThai).ToList();
            CustomerGridview();
            //set mặc định cho  textbox
            txtDonGia.Text = "0";
            txtSoLuong.Text = "1";
        }
        private void CustomerGridview()
        {
            //Ẩn toàn bộ columns
            foreach (DataGridViewColumn item in dgvXuatKho.Columns)
            {
                item.Visible = false;
            }
            //Tùy chỉnh lại
            //đặt readonly
            dgvXuatKho.ReadOnly = true;
            //không cho thêm mới
            dgvXuatKho.AllowUserToAddRows = false;
            //Hiển thị các cột định trước
            //Mã
            var c = dgvXuatKho.Columns["MatHang"];
            c.Visible = true;
            c.Width = 200;
            c.DisplayIndex = 1;

            //Tên
            c = dgvXuatKho.Columns["TenMatHang"];
            c.Visible = true;
            c.Width = 200;
            c.DisplayIndex = 2;

            //Đơn vị tính
            c = dgvXuatKho.Columns["DonViTinh"];
            c.Visible = true;
            c.Width = 100;
            c.DisplayIndex = 3;

            //Số lượng
            c = dgvXuatKho.Columns["SoLuong"];
            c.Visible = true;
            c.Width = 100;
            c.DisplayIndex = 4;

            //Đơn giá
            c = dgvXuatKho.Columns["DonGia"];
            c.Visible = true;
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            c.DisplayIndex = 5;

            //Xóa
            c = dgvXuatKho.Columns["Xoa"];
            c.Visible = true;
            c.Width = 30;
            c.DisplayIndex = 6;
            
        }
        private void HienThiComboNguoiDaiDien()
        {
            DonVi donVi = cbDonVi.SelectedItem as DonVi;
            if (donVi == null) return;
            switch (donVi.GetType().Name)
            {
                case "DoiSanXuat":
                    DoiSanXuat doiSanXuat = db.DoiSanXuat.Include(d => d.DanhSachThanhVien).FirstOrDefault(d => d.TrangThai && d.Id.Equals(donVi.Id));
                    if (doiSanXuat != null && doiSanXuat.DanhSachThanhVien != null)
                    {
                        listNguoiDaiDien = doiSanXuat.DanhSachThanhVien.Where(d => d.TrangThai).OfType<Nguoi>().ToList();
                        cbNguoiDaiDien.DataSource = listNguoiDaiDien;
                    }
                    break;
                case "DoiTac":
                    DoiTac doiTac = db.DoiTac.Include(d => d.NguoiDaiDien).FirstOrDefault(d => d.TrangThai && d.Id.Equals(donVi.Id));
                    if (doiTac != null && doiTac.NguoiDaiDien != null)
                    {
                        listNguoiDaiDien = doiTac.NguoiDaiDien.Where(n => n.TrangThai).OfType<Nguoi>().ToList();
                    }
                    cbNguoiDaiDien.DataSource = listNguoiDaiDien;
                    break;
            }
        }
        private void ExportToExcel()
        {
            nhapXuatKho.NguoiDaiDien = cbNguoiDaiDien.SelectedItem as Nguoi;
            nhapXuatKho.DonVi = cbDonVi.SelectedItem as DonVi;
            nhapXuatKho.SoChungTu = txtSoChungTu.Text;
            nhapXuatKho.NoiDung = txtNoiDung.Text;
            string workbookPath = Application.StartupPath + @"\Template\Excel\JAT_XuatKho";
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(workbookPath,
               0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "",
                true, false, 0, true, false, false);
            Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets[1];
            xlWorkBook.Activate();
            xlWorkSheet.Name = "XuatKho";
            //Add data
            var listXuatKhoChiTiet = nhapXuatKho.DanhSachChiTiet;
            int count = 0;
            int positionStart = 14;
            string start;
            string stop;
            Excel.Range r;
            foreach (NhapXuatKhoChiTiet item in listXuatKhoChiTiet)
            {
                xlWorkSheet.Cells[positionStart + count, 2] = count + 1;
                //Mã mặt hàng
                start = "C" + (count + positionStart).ToString();
                stop = "D" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Merge();
                r.Value2 = item.MatHang.MaMatHang;
                //Mã mặt hàng
                start = "E" + (count + positionStart).ToString();
                stop = "G" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Merge();
                r.Value2 = item.MatHang.TenMatHang;
                xlWorkSheet.Cells[positionStart + count, 8] = item.MatHang.DonViTinh == null ? "" : item.MatHang.DonViTinh.Ten;
                xlWorkSheet.Cells[positionStart + count, 9] = item.SoLuong;
                xlWorkSheet.Cells[positionStart + count, 10] = item.DonGia;
                xlWorkSheet.Cells[positionStart + count, 11] = item.SoLuong * (double)item.DonGia;

                //Format it               

                start = "B" + (count + positionStart).ToString();
                stop = "K" + (count + positionStart).ToString();
                r = (Excel.Range)xlWorkSheet.get_Range(start, stop);
                r.Borders.Color = Color.Black;
                r.RowHeight = 20;
                //r.Style.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                r.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Excel.XlColorIndex.xlColorIndexAutomatic);
                count++;

            }
            string diaChi = "";
            switch (nhapXuatKho.DonVi.GetType().Name)
            {
                case "DoiTac":
                    diaChi = ((DoiTac)nhapXuatKho.DonVi).DiaChi;
                    break;
                case "DoiSanXuat":
                    DoiSanXuat doiSanXuat = ((DoiSanXuat)nhapXuatKho.DonVi);
                    doiSanXuat = db.DoiSanXuat.Include("DayChuyen").Where(d => d.TrangThai && d.Id.Equals(doiSanXuat.Id)).FirstOrDefault();
                    diaChi = doiSanXuat.DayChuyen.TenDayChuyen;
                    break;
            }
            xlWorkSheet.Cells[8, 2] = string.Format("Họ và tên người nhận hàng: {0}", nhapXuatKho.NguoiDaiDien.HoVaTen);
            xlWorkSheet.Cells[9, 2] = string.Format("Tên đơn vị: {0}", nhapXuatKho.DonVi.TenDonVi);
            xlWorkSheet.Cells[10, 2] = string.Format("Địa chỉ: {0}", diaChi);
            xlWorkSheet.Cells[11, 2] = string.Format("Nội dung: {0}", nhapXuatKho.NoiDung);
            xlWorkSheet.Cells[7, 9] = string.Format("{0}", nhapXuatKho.SoChungTu);
            xlWorkSheet.Cells[7, 10] = string.Format("{0}", nhapXuatKho.Ngay.ToString("dd/MM/yyyy"));
            // Hiện chương trình
            xlApp.Visible = true;

            //// Save file
            //xlWorkBook.SaveAs("C:\\JAT_VatTu_DanhMucThepTam_1.xls", Excel.XlFileFormat.xlWorkbookNormal,
            //                null, null, false, false,
            //                Excel.XlSaveAsAccessMode.xlExclusive,
            //                false, false, false, false, false);
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
        }
        #endregion
        #region Events
        private void frmXuatKho_Load(object sender, EventArgs e)
        {
            KhoiTao();
        }
        private void cbMaMatHang_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbMaMatHang.SelectedItem == null) return;
            MatHang item = cbMaMatHang.SelectedItem as MatHang;
            txtTenMatHang.Text = item.TenMatHang;
        }
        private void btnNhap_Click(object sender, EventArgs e)
        {
            ThemMatHang();
        }
        private void cbDonVi_SelectedIndexChanged(object sender, EventArgs e)
        {
            HienThiComboNguoiDaiDien();
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            LuuLai();
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            ReLoadData();
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            ExportToExcel();
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void dgvXuatKho_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int xoaIndex = dgvXuatKho.Columns.IndexOf(dgvXuatKho.Columns["Xoa"]);
            if (e.ColumnIndex == xoaIndex)
            {
                Guid Id =(Guid)dgvXuatKho.Rows[e.RowIndex].Cells["Id"].Value;
                if (Id != null && Id != Guid.Empty)
                {
                    NhapXuatKhoChiTiet nhapXuatKhoChiTiet = nhapXuatKho.DanhSachChiTiet.FirstOrDefault(d => d.TrangThai && d.Id.Equals(Id));
                    if (nhapXuatKhoChiTiet != null)
                    {
                        //xóa mặt hàng đó
                        nhapXuatKho.DanhSachChiTiet.Remove(nhapXuatKhoChiTiet);
                        //reload lại gridview
                        dgvXuatKho.DataSource = nhapXuatKho.DanhSachChiTiet.Where(d => d.TrangThai).ToList();
                        CustomerGridview();
                    }
                }
            }
        }
        #endregion      
    }
}
